package top.huhuiyu.springboot3.util;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.YearMonth;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * 日期工具
 *
 * @author 胡辉煜
 */
public class DateUtils {

  private static final DateTimeFormatter SDF = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
  private static final DateTimeFormatter SDF_SHORT = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  public static final String MIN_TIME = " 00:00:00";
  public static final String MAX_TIME = " 23:59:59";

  /**
   * 获取某年某月的最后一天
   *
   * @param year  年份
   * @param month 月份
   * @return 某年某月的最后一天
   */
  public static int getLastDayOfMonth(int year, int month) {
    YearMonth yearMonth = YearMonth.of(year, month);
    LocalDate lastDay = yearMonth.atEndOfMonth();
    return lastDay.getDayOfMonth();
  }

  /**
   * 获取日期当天的第一秒（列表值1）和最后一秒（列表值2）
   *
   * @param date 要获取信息的日期
   * @return 日期当天的第一秒（列表值1）和最后一秒（列表值2）
   */
  public static List<Date> oneDay(Date date) {
    List<Date> list = new ArrayList<>();
    String day = DateUtils.format(date, true);
    list.add(DateUtils.parse(day + MIN_TIME));
    list.add(DateUtils.parse(day + MAX_TIME));
    return list;
  }

  /**
   * 格式化(yyyy-MM-dd HH:mm:ss)日期
   *
   * @param date 日期
   * @return 日期格式化结果
   */
  public static String format(Date date) {
    return SDF.format(date.toInstant().atZone(ZoneId.systemDefault()));
  }

  /**
   * 格式化日期
   *
   * @param date      日期
   * @param shortMode true：yyyy-MM-dd,false：yyyy-MM-dd HH:mm:ss
   * @return 日期格式化结果
   */
  public static String format(Date date, boolean shortMode) {
    return shortMode ? SDF_SHORT.format(date.toInstant().atZone(ZoneId.systemDefault())) : format(date);
  }

  public static Date parse(String source) {
    try {
      return Date.from(LocalDateTime.parse(source, SDF).atZone(ZoneId.systemDefault()).toInstant());
    } catch (Exception ex) {
      return Date.from(LocalDateTime.parse(source + MIN_TIME, SDF).atZone(ZoneId.systemDefault()).toInstant());
    }
  }

}
